'''
核心就是把链表反转k个之后
判断剩下的有没有够k
不够就停止
够就继续
所以反转的时候的cur.next需要是正常的那个，但是反转过程中的指针cur.next不是，保留cur.next
然后 反转过的链表头就是pre，pre.next赋值给保留的k之后的cur
reverse需要返回反转的字符串pre.next以及字符串反转之后的头节点head
然后把反转的pre.next的指针指到cur
'''
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

#
#
# @param head ListNode类
# @param k int整型
# @return ListNode类
#
class Solution:
    def reverse_k(self, head, k):
        pre, cur = None, head
        for _ in range(k):
            cur.next, pre, cur = pre, cur, cur.next
        return pre, head
    def reverseKGroup(self , head , k ):
        # write code here
        dum = ListNode(None)
        dum.next = head
        pre, cur = dum, head
        while cur:
            reverse_start = cur
            # 找到第k+1个节点，同时亦是判断是否不足k个节点
            for _ in range(k):
                if not cur: return dum.next
                cur = cur.next
            pre.next, pre = self.reverse_k(reverse_start, k)
            pre.next = cur
        return dum.next
